#include <iostream>

// 菱形继承
// 两个派生类继承同一个基类
// 又有某个类同时继承者两个派生类
// 这种继承被称为菱形继承，或者钻石继承
// 问题：菱形继承会导致数据冗余和二义性
// 解决方法：使用虚继承

class Animal
{
public:
    int m_Age;
};

class Sheep : virtual public Animal{};

class Tuo : virtual public Animal{};

class SheepTuo : public Sheep, public Tuo{};

void test01()
{
    SheepTuo st;
    // 作用域解决二义性
    st.Sheep::m_Age = 18;
    st.Tuo::m_Age = 20;
    std::cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << std::endl;
    std::cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << std::endl;

    // 这份数据我们只需要一份，菱形继承导致数据冗余
    // 解决方法：使用虚继承 virtual
    std::cout << "st.m_Age = " << st.m_Age << std::endl;
} 

// virtual 的底层是
// vbptr-vbtable  虚基类指针
// v-virtual 
// b-base 
// ptr-pointer

int main()
{
    test01();
    return 0;
}